//
// Created by Zhangwj on 2023/9/27.
//

#ifndef COMPILE_TASK2_LVALEXPSTMTITEMNODE_H
#define COMPILE_TASK2_LVALEXPSTMTITEMNODE_H


#include "StmtItemNode.h"
#include "../../Parser.h"
#include "../LValNode.h"

enum class LValExpStmtItemNodeType {
    LVALEXP,
    GETINT,
    EXP,
};

class LValExpStmtItemNode : public StmtItemNode {
public:
    // LVal '=' Exp ';'               -> Ident { '[' Exp ']' } '=' Exp ';'
    // | LVal '=' 'getint''('')'';'   -> Ident { '[' Exp ']' } '=' 'getint' '('...
    // | [Exp] ';'                    -> Ident { '[' Exp ']' } || ';' || '(' Exp ')'... || Number || '+'|'-'|'!'
    LValExpStmtItemNodeType type;
    std::unique_ptr<LValNode> LVal;
    std::unique_ptr<ExpNode> Exp;

    static std::unique_ptr<LValExpStmtItemNode> LValExpStmtItemParser(Parser &parser);
};


#endif //COMPILE_TASK2_LVALEXPSTMTITEMNODE_H
